// Copyright 2010, Vanya Davidenko.
// Используемая кодировка: UTF-8.

#ifndef LIBV_SLEEP_H_
#define LIBV_SLEEP_H_

#ifdef _WIN32
#include <libv/windows_lean.h>
typedef unsigned __int32 uint32_t;
#else
# include <stdint.h>
# include <unistd.h>
#endif


namespace libv
{

/** Вызов системного вызова Sleep с миллисекундной точностью.
  * В Windows есть функция Sleep с миллисекундной точностью.
  * В *nix есть sleep с секундной точностью и
  * usleep с микросекундной точностью, но секундной максимальной задержкой.
  * Классический переносимый вариант sleep через select с микросекундной
  * точностью не удачен для Windows: нужно явно линковать winsock2.
  * В Windows: mSleep(0) передаст управление другому потоку с таким же
  * приоритетом или, в случае его отсутствия, продолжит выполнение. */
inline bool MilliSleep(const uint32_t ms)
{
#ifdef _WIN32
        ::Sleep(ms);
        return true;
#else
        uint32_t secs = ms / 1000;
        if ( secs > 0 && sleep(ms / 1000) != 0 )
            return false;
        return ::usleep(static_cast<useconds_t>((ms % 1000) * 1000)) == 0;
#endif
}

}  // libv

#endif  // LIBV_SLEEP_H_
